
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.clima.view.mbean;

import com.brain.clima.dto.EncuestaDto;
import com.brain.clima.dto.EncuestadoDto;
import com.brain.clima.dto.PreguntaDto;
import com.brain.clima.dto.RespuestaDto;
import com.brain.clima.manager.EncuestaManager;
import com.brain.clima.manager.EncuestadoManager;
import com.brain.clima.manager.RespuestaManager;
import com.brain.clima.view.util.Comparador;
import com.brain.clima.view.util.ConstantesClima;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.UsuarioDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ApplicationHelper;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.manager.PersonaManager;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Cmontes
 */
@Controller("encuestaPendMBean")
@Scope("session")
public class EncuestaPendMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(EncuestaPendMBean.class);
    @Resource
    private EncuestaManager manager;
    @Resource
    private EncuestadoManager encuestadoManager;
    @Resource
    private RespuestaManager respuestaManager;
    @Resource
    private RecursosManager recursosManager;
    private List<EncuestaDto> lista;
    private EncuestaDto dto;
    private EncuestaDto dtoFiltro;
    private String keyTitulo = "encuesta.panel";
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    @Resource
    private PersonaManager personaManager;
    private PreguntaDto preguntaDto;
    //private OpcionDto opcionDto;
    private PersonaDto personaDto;
    private EncuestadoDto encuestadoDto;
    private int cantTotalPreguntas;
    private int preguntaActual;
    private int cantTotalOpciones;

    public EncuestaPendMBean() {
        this.dtoFiltro = new EncuestaDto();
    }

    public String iniciar() {
        this.dto = null;
        this.lista = null;
        this.dtoFiltro = new EncuestaDto();
        this.dtoFiltro.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTA_ESTADO_GENERADO));

        //buscar(null);
        personaDto = new PersonaDto();
        if (sessionMBean.getSessionUsuarioDto() != null) {
            PersonaDto persDto = this.obtenerPersonaPorUsuarioConectado(sessionMBean.getSessionUsuarioDto());
            if (persDto != null) {
                personaDto.setId(persDto.getId());
                try {
                    this.lista = encuestadoManager.obtenerEncuestasxPersona(dtoFiltro, personaDto);
                } catch (DAOException ex) {
                    logger.error("ERROR DE SISTEMA", ex);
                    showError(ex.getMessage());
                }
            }
        }

        return ConstantesClima.UrlNavegacion.URL_LISTA_ENCUESTA_PENDIENTE;
    }

    private PersonaDto obtenerPersonaPorUsuarioConectado(UsuarioDto usuarioDto) {
        PersonaDto personaDto = null;
        List<PersonaDto> lPersonDto;
        try {
            if (usuarioDto != null) {
                lPersonDto = this.personaManager.obtenerPersonaPorUsuarioSistema(usuarioDto.getId());
                if (!lPersonDto.isEmpty()) {
                    personaDto = lPersonDto.get(0);
                }
            }
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
        }
        return personaDto;
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesClima.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.preguntaDto = new PreguntaDto();
        return ConstantesClima.UrlNavegacion.URL_ENCUESTA;
    }

    public void buscar(ActionEvent ae) {
        try {
            this.lista = this.manager.obtenerEncuestas(dtoFiltro);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public void cargarRespuestasPregunta() {
        try {
            if (ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_UNICA_HORIZONTAL.equals(
                    preguntaDto.getTipoPreguntaDto().getId())
                    || ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_UNICA_VERTICAL.equals(
                    preguntaDto.getTipoPreguntaDto().getId())
                    || ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_UNICA_DESPLEGABLE.equals(
                    preguntaDto.getTipoPreguntaDto().getId())) {
                List<RespuestaDto> listResp = respuestaManager.obtenerRespuestaxPreguntaEncuestado(preguntaDto, encuestadoDto);
                if (listResp != null && listResp.size() > 0) {
                    preguntaDto.setOpcionSeleted(listResp.get(0).getOpcionDto().getId());
                }
            } else if (ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_MULTIPLE_HORIZONTAL.equals(
                    preguntaDto.getTipoPreguntaDto().getId())
                    || ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_MULTIPLE_VERTICAL.equals(
                    preguntaDto.getTipoPreguntaDto().getId())) {
                List<RespuestaDto> listResp = respuestaManager.obtenerRespuestaxPreguntaEncuestado(preguntaDto, encuestadoDto);
                if (listResp != null && listResp.size() > 0) {
                    for (int n = 0; n < listResp.size(); n++) {
                        for (int p = 0; p < preguntaDto.getListaOpcionesResp().size(); p++) {
                            if (listResp.get(n).getOpcionDto().getId().equals(preguntaDto.getListaOpcionesResp().get(p).getId())) {
                                preguntaDto.getListaOpcionesResp().get(p).setSelected(true);
                                break;
                            }
                        }
                    }
                }
            } else if (ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_ABIERTA.equals(
                    preguntaDto.getTipoPreguntaDto().getId())) {
                List<RespuestaDto> listResp = respuestaManager.obtenerRespuestaxPreguntaEncuestado(preguntaDto, encuestadoDto);
                if (listResp != null && listResp.size() > 0) {
                    preguntaDto.setTextInserted(listResp.get(0).getValor());
                }
            }
        } catch (Exception e) {
        }
    }

    public void rellenar() {

        try {
            List<EncuestadoDto> listEncuestados = encuestadoManager.obtenerEncuestadoxPersona(personaDto, this.dto);
            if (listEncuestados != null && listEncuestados.size() > 0) {
                encuestadoDto = listEncuestados.get(0);
            }
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
        Collections.sort(this.dto.getListaPreguntas(), new Comparador("orden"));

        cantTotalPreguntas = this.dto.getListaPreguntas().size();
        for (int i = 0; i < this.dto.getListaEncuestados().size(); i++) {
            if (this.dto.getListaEncuestados().get(i).getPersonaDto().getId().equals(personaDto.getId())) {
                //Si el usuario aun no respondio ninguna pregunta
                if (this.dto.getListaEncuestados().get(i).getPreguntaDto() == null) {
                    preguntaDto = this.dto.getListaPreguntas().get(0);
                    preguntaActual = 1;
                } else {
                    preguntaDto = this.dto.getListaEncuestados().get(i).getPreguntaDto();
                    preguntaActual = this.dto.getListaEncuestados().get(i).getNumeroPregunta().intValue();

                    cargarRespuestasPregunta();
                }
            }
        }
        cantTotalOpciones = preguntaDto.getListaOpcionesResp().size();
    }

    public void irPreguntaAnterior() {
        if (preguntaActual > 0) {
            preguntaActual = preguntaActual - 1;
            preguntaDto = this.dto.getListaPreguntas().get(preguntaActual - 1);
            cantTotalOpciones = preguntaDto.getListaOpcionesResp().size();
            cargarRespuestasPregunta();
        }
    }

    public boolean irPreguntaSiguiente() throws DAOException {
        if (ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_UNICA_HORIZONTAL.equals(
                preguntaDto.getTipoPreguntaDto().getId())
                || ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_UNICA_VERTICAL.equals(
                preguntaDto.getTipoPreguntaDto().getId())
                || ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_UNICA_DESPLEGABLE.equals(
                preguntaDto.getTipoPreguntaDto().getId())) {
            if (preguntaDto.getEsObligatorio() && preguntaDto.getOpcionSeleted() == null) {
                showError(UtilCore.Internacionalizacion.getMensajeInternacional("encuestado.mensaje.validacion.pregunta"));
                return false;
            }
            if (preguntaDto.getOpcionSeleted() != null) {
                RespuestaDto respuestaDto = new RespuestaDto();
                for (int i = 0; i < preguntaDto.getListaOpcionesResp().size(); i++) {
                    if (preguntaDto.getOpcionSeleted().equals(preguntaDto.getListaOpcionesResp().get(i).getId())) {

                        List<RespuestaDto> listResp = respuestaManager.obtenerRespuestaxPreguntaEncuestado(preguntaDto, encuestadoDto);
                        if (listResp != null && listResp.size() > 0) {
                            respuestaDto = listResp.get(0);
                            respuestaDto.setOpcionDto(preguntaDto.getListaOpcionesResp().get(i));
                            respuestaManager.editar(respuestaDto);
                        } else {
                            respuestaDto.setOpcionDto(preguntaDto.getListaOpcionesResp().get(i));
                            respuestaDto.setPreguntaDto(preguntaDto);
                            respuestaDto.setEncuestadoDto(encuestadoDto);
                            respuestaManager.nuevo(respuestaDto);
                        }
                        encuestadoDto.setPreguntaDto(preguntaDto);
                        encuestadoDto.setNumeroPregunta(new Long(preguntaActual));
                        encuestadoDto.setEncuestaDto(dto);
                        encuestadoManager.editar(encuestadoDto);
                        break;
                    }
                }
            } else {//para las preguntas que no sean obligatorias, si es que habia algo en base de datos se elimina
                List<RespuestaDto> listResp = respuestaManager.obtenerRespuestaxPreguntaEncuestado(preguntaDto, encuestadoDto);
                if (listResp != null && listResp.size() > 0) {
                    respuestaManager.eliminar(listResp.get(0));
                }
            }
        } else if (ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_MULTIPLE_HORIZONTAL.equals(
                preguntaDto.getTipoPreguntaDto().getId())
                || ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_MULTIPLE_VERTICAL.equals(
                preguntaDto.getTipoPreguntaDto().getId())) {
            if (preguntaDto.getEsObligatorio()) {
                boolean sel = false;
                for (int i = 0; i < preguntaDto.getListaOpcionesResp().size(); i++) {
                    //System.out.println("opcion: "+ i+ "==> "+preguntaDto.getListaOpcionesResp().get(i).isSelected());
                    if (preguntaDto.getListaOpcionesResp().get(i).isSelected()) {
                        //showError(UtilCore.Internacionalizacion.getMensajeInternacional("encuestado.mensaje.validacion.pregunta"));
                        sel = true;
                        break;
                    }
                }
                if (!sel) {
                    showError(UtilCore.Internacionalizacion.getMensajeInternacional("encuestado.mensaje.validacion.pregunta"));
                    return false;
                }
            }

            List<RespuestaDto> listResp = respuestaManager.obtenerRespuestaxPreguntaEncuestado(preguntaDto, encuestadoDto);
            for (int j = 0; j < listResp.size(); j++) {
                respuestaManager.eliminar(listResp.get(j));
            }

            for (int i = 0; i < preguntaDto.getListaOpcionesResp().size(); i++) {
                if (preguntaDto.getListaOpcionesResp().get(i).isSelected()) {
                    RespuestaDto respuestaDto = new RespuestaDto();
                    respuestaDto.setOpcionDto(preguntaDto.getListaOpcionesResp().get(i));
                    respuestaDto.setPreguntaDto(preguntaDto);
                    respuestaDto.setEncuestadoDto(encuestadoDto);
                    respuestaManager.nuevo(respuestaDto);
                }
            }

            encuestadoDto.setPreguntaDto(preguntaDto);
            encuestadoDto.setNumeroPregunta(new Long(preguntaActual));
            encuestadoDto.setEncuestaDto(dto);
            encuestadoManager.editar(encuestadoDto);

        } else if (ConstantesClima.Parametro.PREGUNTA_TIPO_RESPUESTA_ABIERTA.equals(
                preguntaDto.getTipoPreguntaDto().getId())) {
            if (preguntaDto.getEsObligatorio()) {
                if (preguntaDto.getTextInserted() == null || preguntaDto.getTextInserted().trim().equals("")) {
                    showError(UtilCore.Internacionalizacion.getMensajeInternacional("encuestado.mensaje.validacion.pregunta"));
                    return false;
                }
            }

            RespuestaDto respuestaDto = new RespuestaDto();
            List<RespuestaDto> listResp = respuestaManager.obtenerRespuestaxPreguntaEncuestado(preguntaDto, encuestadoDto);
            if (listResp != null && listResp.size() > 0) {
                respuestaDto = listResp.get(0);
                respuestaDto.setValor(preguntaDto.getTextInserted());
                respuestaManager.editar(respuestaDto);
            } else {
                respuestaDto.setValor(preguntaDto.getTextInserted() == null ? "" : preguntaDto.getTextInserted());
                respuestaDto.setPreguntaDto(preguntaDto);
                respuestaDto.setEncuestadoDto(encuestadoDto);
                respuestaManager.nuevo(respuestaDto);
            }

            encuestadoDto.setPreguntaDto(preguntaDto);
            encuestadoDto.setNumeroPregunta(new Long(preguntaActual));
            encuestadoDto.setEncuestaDto(dto);
            encuestadoManager.editar(encuestadoDto);
        }

        if (preguntaActual < cantTotalPreguntas) {
            preguntaDto = this.dto.getListaPreguntas().get(preguntaActual);
            preguntaActual = preguntaActual + 1;
            cantTotalOpciones = preguntaDto.getListaOpcionesResp().size();
        }
        return true;
    }

    public void finalizarEncuesta() throws DAOException {

        if (irPreguntaSiguiente()) {

            encuestadoDto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTADO_ESTADO_TERMINADO));
            encuestadoDto.setEncuestaDto(dto);


            encuestadoManager.editar(encuestadoDto);


            //validar si la encuesta tiene aun pendientes de encuestar, sino se cierra la encuesta.        
            List<EncuestadoDto> listEncuestados = encuestadoManager.obtenerEncuestadosNoTerminadosXEncuesta(dto);
            if (listEncuestados == null || listEncuestados.isEmpty()) {

                dto.setEstadoDto(ApplicationHelper.obtenerParametroPorId(ConstantesClima.Parametro.ENCUESTA_ESTADO_TERMINADO));
                manager.editar(dto);
            }
            RequestContext.getCurrentInstance().addCallbackParam("ok", true);

            try {
                this.lista = encuestadoManager.obtenerEncuestasxPersona(dtoFiltro, personaDto);
            } catch (DAOException ex) {
                logger.error("ERROR DE SISTEMA", ex);
                showError(ex.getMessage());
            }
        } else {
            RequestContext.getCurrentInstance().addCallbackParam("ok", false);
        }
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        EncuestaPendMBean.logger = logger;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public EncuestaManager getManager() {
        return manager;
    }

    public void setManager(EncuestaManager manager) {
        this.manager = manager;
    }

    public List<EncuestaDto> getLista() {
        return lista;
    }

    public void setLista(List<EncuestaDto> lista) {
        this.lista = lista;
    }

    public EncuestaDto getDto() {
        return dto;
    }

    public void setDto(EncuestaDto dto) {
        this.dto = dto;
    }

    public EncuestaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(EncuestaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public PreguntaDto getPreguntaDto() {
        return preguntaDto;
    }

    public void setPreguntaDto(PreguntaDto preguntaDto) {
        this.preguntaDto = preguntaDto;
    }

    public int getCantTotalPreguntas() {
        return cantTotalPreguntas;
    }

    public void setCantTotalPreguntas(int cantTotalPreguntas) {
        this.cantTotalPreguntas = cantTotalPreguntas;
    }

    public int getPreguntaActual() {
        return preguntaActual;
    }

    public void setPreguntaActual(int preguntaActual) {
        this.preguntaActual = preguntaActual;
    }

    public int getCantTotalOpciones() {
        return cantTotalOpciones;
    }

    public void setCantTotalOpciones(int cantTotalOpciones) {
        this.cantTotalOpciones = cantTotalOpciones;
    }

    public EncuestadoDto getEncuestadoDto() {
        return encuestadoDto;
    }

    public void setEncuestadoDto(EncuestadoDto encuestadoDto) {
        this.encuestadoDto = encuestadoDto;
    }
}
